﻿using System.Data.SqlClient;
using System.Data;
using System;

namespace AccesoBD
{
 
public class AcessoBD
{
    //
    public static String StringConexion;

    public AcessoBD(String pCadenaCon)
    {
        _cadena = pCadenaCon;
    }


    public AcessoBD()
    {
        
        //_cadena = "Data Source=SAFSDB1.mssql.somee.com;Initial Catalog=SAFSDB1;Persist Security Info=False;User ID=mejia2089_SQLLogin_1;Password=vov38yb21k;Packet Size=4096;Workstation ID=SAFSDB1.mssql.somee.com";
        _cadena = StringConexion;
    }

	private string _cadena = "";

	public string Cadena {
		get {
			return _cadena;
		}
	}


	/// <summary>
	/// Método encargado en retornar una conexión a la DB
	/// </summary>
	/// <returns></returns>
	/// <remarks></remarks>
    public SqlConnection GetConnection()
	{
		return new SqlConnection(Cadena);
	}


    /// <summary>
    /// Metodo para realizar consultas en la BD a travez de Store Procedure
    /// </summary>
    /// <param name="psp">Nombre del store procedure, tipo String</param>
    /// <param name="pparametros">Parametros de la consulta, tipo Parametros[]</param>
    /// <remarks></remarks>
    public SqlDataReader execute_SP_Consulta(string psp, Parametros[] pparametros)
    {
        SqlCommand _cmd = new SqlCommand();
        string _nombre = null;
        _cmd.Connection = this.GetConnection();

        if (pparametros != null)
        {
            //transformar la colección de parámetros en SqlParameter...
            foreach (Parametros _elemento in pparametros)
            {
                _nombre = "@" + _elemento.Nombre;
                _cmd.Parameters.AddWithValue(_nombre, _elemento.Dato);
            }
        }

        try
        {
            //se indica que se va a ejecutar un store procedure...
            _cmd.CommandType = CommandType.StoredProcedure;

            //se asigna el usp a ejecutar
            _cmd.CommandText = psp;

            //se abre la conexion...
            _cmd.Connection.Open();

            //ejecución del comando...
            return _cmd.ExecuteReader();

        }
        catch (Exception ex)
        {
            throw ex;
        }
        //finally
        //{
        //    _cmd.Connection.Close();
        //}
    }



    public SqlDataReader execute_Consulta(string psp, Parametros[] pparametros)
    {
        SqlCommand _cmd = new SqlCommand();
        string _nombre = null;
        _cmd.Connection = this.GetConnection();

        if (pparametros != null)
        {
            //transformar la colección de parámetros en SqlParameter...
            foreach (Parametros _elemento in pparametros)
            {
                _nombre = "@" + _elemento.Nombre;
                _cmd.Parameters.AddWithValue(_nombre, _elemento.Dato);
                psp = psp.Replace(_elemento.Nombre, _nombre);
            }
        }

        try
        {

            //se asigna el usp a ejecutar
            _cmd.CommandText = psp;

            //se abre la conexion...
            _cmd.Connection.Open();

            //ejecución del comando...
            return _cmd.ExecuteReader();

        }
        catch (Exception ex)
        {
            throw ex;
        }
        //finally
        //{
        //    _cmd.Connection.Close();
        //}
    }








    /// <summary>
    /// Metodo para ejecutar sentencias en la BD que no retornan nada. Ejemplo: Update o Delete.
    /// </summary>
    /// <param name="pSQL">Sentencia SQL, tipo String</param>
    /// <param name="pparametros">Parametros de la consulta, tipo Parametros[]</param>
    /// <remarks></remarks>
    public bool executeSQL(string pSQL, Parametros[] pparametros)
    {
        String _nombre = "";
        SqlCommand _cmd = new SqlCommand();
        _cmd.Connection = this.GetConnection();


        if (pparametros != null)
        {
            //transformar la colección de parámetros en SqlParameter...
            foreach (Parametros _elemento in pparametros)
            {
                _nombre = "@" + _elemento.Nombre;
                _cmd.Parameters.AddWithValue(_nombre, _elemento.Dato);
                pSQL = pSQL.Replace(_elemento.Nombre, _nombre);
            }
        }

        try
        {
            _cmd.CommandText = pSQL;

            if (_cmd.Connection.State == ConnectionState.Closed)
            {
                _cmd.Connection.Open();

            }
            _cmd.ExecuteNonQuery();
            return true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            _cmd.Connection.Close();          
        }
    }


    /// <summary>
    /// Metodo para insertar en la BD y retorna el id del registro que se acaba de insertar.
    /// </summary>
    /// <param name="pSQL">Sentencia SQL, tipo String</param>
    /// <param name="pparametros">Parametros de la consulta, tipo Parametros[]</param>
    /// <remarks></remarks>
    public int executeSQLInsert(string pSQL, Parametros[] pparametros)
    {
        pSQL = pSQL + " select cast(scope_identity() as int)";
        int nuevoId = 0;
        String _nombre = "";
        SqlCommand _cmd = new SqlCommand();
        _cmd.Connection = this.GetConnection();


        if (pparametros != null)
        {
            //transformar la colección de parámetros en SqlParameter...
            foreach (Parametros _elemento in pparametros)
            {
                _nombre = "@" + _elemento.Nombre;
                _cmd.Parameters.AddWithValue(_nombre, _elemento.Dato);
                pSQL = pSQL.Replace(_elemento.Nombre, _nombre);
            }
        }

        try
        {
            _cmd.CommandText = pSQL;

            if (_cmd.Connection.State == ConnectionState.Closed)
            {
                _cmd.Connection.Open();

            }
            nuevoId = (int)_cmd.ExecuteScalar();
            return nuevoId;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            _cmd.Connection.Close();
        }
    }


    /// <summary>
    /// Metodo para insertar en la BD y funciona por medio de transacción. No se cierra la conexion.
    /// </summary>
    /// <param name="pTransaccion">Transaccion con la BD, tipo SqlTransaction</param>
    /// <param name="pSQL">Sentencia SQL, tipo String</param>
    /// <param name="pparametros">Parametros de la consulta, tipo Parametros[]</param>
    /// <remarks></remarks>
    public int executeSQLInsertTransation(SqlTransaction pTransaccion, String pSQL, Parametros[] pParametros)
    {
        try
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = pTransaccion.Connection;
            cmd.Transaction = pTransaccion;
            pSQL = pSQL + " select cast(scope_identity() as int)";
            String nombre = "";
            foreach (Parametros _elemento in pParametros)
            {
                nombre = "@" + _elemento.Nombre;
                cmd.Parameters.AddWithValue(nombre, _elemento.Dato);
                pSQL = pSQL.Replace(_elemento.Nombre, nombre);
            }

            cmd.CommandText = pSQL;
            return (int)cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            throw ex;
        }

        
    }



    /// <summary>
    /// Metodo para ejecutar una sentencia en la BD y funciona por medio de transacción. No se cierra la conexion.
    /// </summary>
    /// <param name="pTransaccion">Transaccion con la BD, tipo SqlTransaction</param>
    /// <param name="pSQL">Sentencia SQL, tipo String</param>
    /// <param name="pparametros">Parametros de la consulta, tipo Parametros[]</param>
    /// <remarks></remarks>
    public void executeSQLTransation(SqlTransaction pTransaccion, String pSQL, Parametros[] pParametros)
    {
        try
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = pTransaccion.Connection;
            cmd.Transaction = pTransaccion;
            String nombre = "";
            foreach (Parametros _elemento in pParametros)
            {
                nombre = "@" + _elemento.Nombre;
                cmd.Parameters.AddWithValue(nombre, _elemento.Dato);
                pSQL = pSQL.Replace(_elemento.Nombre, nombre);
            }

            cmd.CommandText = pSQL;
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw ex;
        }


    }

  }
}